import type { TableColumnCtx } from 'element-plus'
import { Ref } from 'vue'

interface SpanMethodProps<T> {
  row: T
  column: TableColumnCtx<T>
  rowIndex: number
  columnIndex: number
}
type DataRef<T> = Ref<T[]>


// 合并单元格
export const objectSpanMethod = <T extends Record<string, any>>({
  row,
  column,
  rowIndex,
  columnIndex,
}: SpanMethodProps<T>, // 必填 行列参数
  data : DataRef<T>, // 必填 数据
  rowArray: number[] = [0], // 选填 第几列合并行
  columnArray: number[] = [0] // 选填 第几行合并列
) => {
  let rowspan = 1
  let colspan = 1

  // 行合并逻辑
  if (rowArray.includes(columnIndex)) {
    const previousRow = rowIndex > 0 ? data.value[rowIndex - 1] : null // 查找前一行

    if (previousRow && previousRow[column.property] === row[column.property]) { // 判断当前行和前一行的值是否相同
      return [0, 0] // 如果相同，返回 [0, 0] 表示不显示此单元格
    }

    // 查找之后有多少行和当前行的值相同，进行合并
    for (let i = rowIndex + 1; i < data.value.length; i++) {
      if (data.value[i][column.property] === row[column.property]) {
        rowspan++
      } else {
        break
      }
    }
  }
  // 列合并逻辑
  if (columnArray.includes(rowIndex)) {
    const dataArr = []
    for(let k in row){
      dataArr.push(row[k])
    }
    
    const previousColumnValue = columnIndex > 0 ? dataArr[column.no-1] : null // 查找前一列属性值
    
    if (previousColumnValue && previousColumnValue === row[column.property]) { // 判断当前列和前一列的值是否相同
      return [0, 0] // 如果相同，返回 [0, 0] 表示不显示此单元格
    }

    // 查找之后有多少列和当前列的值相同，进行合并
    for (let i = column.no + 1; i < dataArr.length; i++) {
      if( dataArr[i] === row[column.property]){
        colspan++
      } else {
        break
      }
    }
  }

  return [rowspan, colspan] // 返回合并的行数和列数
}